package com.bill.gaty.audrey.expressionarithmethique.components;

import com.bill.gaty.audrey.expressionarithmethique.components.util.SaisieUtil;
import com.bill.gaty.audrey.expressionarithmethique.domain.Noeud;

public 
class Depileur {
	private   Noeud  listeDesNoeud=null;//l'arbre reprsentant l'expression saisie
	private    StringBuffer expre=new StringBuffer();
	
		public Depileur(Noeud  listeDesNoeud){
		this.listeDesNoeud=listeDesNoeud;
			afficheurNG(this.listeDesNoeud);
	}
		public Depileur(){
			
		}
		public Noeud getNoeud(){return listeDesNoeud;}
		public String getexpression(){return expre.toString();}
	public String afficher(){
		System.out.println(expre.length());
		String res= expre.toString();
		expre=new StringBuffer();
		return res;
	}
	public   synchronized String afficher(Noeud a){
		expre=new StringBuffer();
		//afficherExpression(a);
		afficheurNG(a);
		return expre.toString();
	}
	 
	private   synchronized void append(Object data) {
		// TODO Auto-generated method stub
		 
		synchronized (expre) {
			//System.err.println("addind data="+data);
			expre.append(data);
		}
	
	}
	
	public   int countNoeud(Noeud node) {
		// TODO Auto-generated method stub
		if(null==node) return 0;
		return 1+countNoeud(node.getOperandeGauche())+countNoeud(node.getOperandeDroite());
		 
	}
	public    void afficheurNG(Noeud expr) {
		
		if(null==expr){
			System.err.println("node null");
			return;
		}
		if (expr.isConstante())
			append(expr.getValConstante());
			else if (expr.isVariable())//cas d'une variable
		
				append( expr.getLettreVariable());
		
			else if (expr.isFunction()){
							 if (expr.isFonctionMoins()) {
								 char c=lastChar();
								 if(c=='*'||c=='/'||c=='^'){
									 append("(-");
									 afficheurNG(expr.getOperandeGauche());
									 append(")");
								 }else if(c=='+'){
									 removeLast();
									 append("-");
									 afficheurNG(expr.getOperandeGauche());
								 }else if(c=='-'){
									 removeLast();
									 append("+");
									 afficheurNG(expr.getOperandeGauche());
								 }else{
									 append("-");
									 afficheurNG(expr.getOperandeGauche()); 
								 }
								
			
								
										}
							else{ 
								append(SaisieUtil.get(expr.getadresseFonction()));
								
								append("(");
		
								afficheurNG(expr.getOperandeGauche());
															append(")");
		
					          }
			}
			else if(expr.isFacteur()){
				if(expr.getOperandeGauche().isConstante()||expr.getOperandeGauche().isFunction()||expr.getOperandeGauche().isVariable()){
				  
					if(expr.isFonctionMoins()){
						append("(");
						afficheurNG(expr.getOperandeGauche());
						append(")");
					}else
				afficheurNG(expr.getOperandeGauche());
				 
				}else{
					append("(");
				afficheurNG(expr.getOperandeGauche());
				append(")");	
				}
				
				append(expr.getType());
				if(expr.getOperandeDroite().isConstante()||expr.getOperandeDroite().isFunction()||expr.getOperandeDroite().isVariable()){
					if(expr.isFonctionMoins()){
						append("(");
						afficheurNG(expr.getOperandeDroite());
						append(")");
					}else
					afficheurNG(expr.getOperandeDroite());
					 
					}else{
						append("(");
					afficheurNG(expr.getOperandeDroite());
					append(")");	
					}
				 
			}
          else if(expr.isAdditionOp()){
				
				afficheurNG(expr.getOperandeGauche());
				
				if(expr.getOperandeDroite().isFonctionMoins()){
					    if(expr.isPlus()){
					    	afficheurNG(expr.getOperandeDroite());
					    }else{
					    	append("+");
					    	afficheurNG(expr.getOperandeDroite());
					    }
					 
				}else{
					append(expr.getType());
				afficheurNG(expr.getOperandeDroite());
				}
			}
			 
		}
	private   synchronized void removeLast() {
		// TODO Auto-generated method stub
		synchronized (expre) {
			int pos=expre.length()-1;
			if(pos>0)
			expre.deleteCharAt(pos);
		}
	}
	private   synchronized char lastChar() {
		// TODO Auto-generated method stub
		synchronized (expre) {
			int pos=expre.length()-1;
			if(pos>0)
			return expre.charAt(pos);
			return ' ';
		}
	}
	public   String afficheurNGDone(Noeud node) {
		// TODO Auto-generated method stub
		expre=new StringBuffer();
		afficheurNG(node);
		return expre.toString();
	}
	
	
}
